package com.bdqn.t382.controller;

import com.bdqn.t382.entity.SysUser;
import com.bdqn.t382.service.SysUserService;
import com.bdqn.t382.utils.Constants;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Controller
public class LoginController extends BaseController {
    @Autowired
    private SysUserService sysUserService;
    @Autowired
    private HttpServletRequest request;

    /**
     * 负责转发到任意路径
     */

    public String forward(String url) {
        return UrlBasedViewResolver.FORWARD_URL_PREFIX + url;
    }

    /**
     * 负责重定向任意路径
     */
    public String redirect(String url) {
        return UrlBasedViewResolver.REDIRECT_URL_PREFIX + url;
    }

    /**
     * 获取 request 对象
     */

    public HttpServletRequest request() {
//        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }

    /**
     * 获取 session 对象
     */
    public HttpSession session() {
        // 通过 request 对象可以获取到 session
        return request().getSession();
    }

    @GetMapping("/login")
    public String toLogin() {
        // 由于 login.jsp 页面不在 WEB-INF 下，所以不能返回逻辑视图名称
        // 需要使用 forward:前缀告知 SpringMVC 转发到根路径下的 login.jsp
//        return "forward:/login.jsp";
        // 调用 forward 方法，则减少了自己拼接写出的风险
        return forward("/login.jsp");
//        return "login";
    }

    @PostMapping("/login")
    public String login(@RequestParam("account") String account,
                        @RequestParam("password") String password,
                        HttpServletRequest request, HttpSession session) {
        SysUser loginUser = sysUserService.login(account, password);
        if (loginUser != null) {
            // 登录成功，用户信息存入 session
            session(Constants.SESSION_USER, loginUser);
            // 调用 session()方法即可获取到 session 对象
//            session().setAttribute("loginUser", loginUser);
            // 重定向到后台首页
            return redirect("/main/index");
        } else {
            // 调用 request()方法即可获取到 request 对象
//            request().setAttribute("error", "用户名或密码错误！");
            // 设置错误信息到 request 作用域
            throw new RuntimeException("登录失败，用户名或密码错误！");
//            request(Constants.REQUEST_ERROR, "用户名或密码错误！");
            // 转发到登录页面
//            return forward("/login.jsp");
        }
    }

    // 跳转到后台首页
    @GetMapping("/main/index")
    public String index() {
        return "index";
    }

    @ExceptionHandler(value = RuntimeException.class)
    public String handlerException(RuntimeException e, HttpServletRequest request) {
        // 设置捕获的错误对象到 request 作用域
        request.setAttribute(Constants.REQUEST_ERROR, e);
        // 跳转异常页面：/WEB-INF/jsp/500.jsp
        return "500";
    }
}
